package com.kalvan.core.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 工作日判断工具，可以跟后来数据库绑定实现动态调整
 *
 * @author chenliang
 * @version 2018年8月30日
 * @see HolidayUtil
 */
public final class HolidayUtil {

    // TODO 可以做成配置或者数据库管理
    private static String adjustDay = "20180924,20180929,20180930,20181001,20181002,20181003,20181004,20181005";

    private HolidayUtil() {
    }

    /**
     * 初始化假日多个用,拼接 "20180924,20180929"
     *
     * @param params params
     */
    public static void initHoliday(String params) {
        adjustDay = params;
    }

    /**
     * 调整(工作日-非工作日 或 非工作日-工作日)
     *
     * @param yyyyMMdd 日期
     * @return boolean
     */
    public static boolean isAdjust(String yyyyMMdd) {
        return adjustDay.indexOf(yyyyMMdd) != -1;
    }

    /**
     * 是否为周六周日
     *
     * @param yyyyMMdd 日期
     * @return boolean
     */
    private static boolean isWeekend(String yyyyMMdd) {
        SimpleDateFormat sdfInput = new SimpleDateFormat("yyyyMMdd");
        Calendar calendar = Calendar.getInstance();
        Date date = new Date();
        try {
            date = sdfInput.parse(yyyyMMdd);
        } catch (ParseException e) {
            return false;
        }
        calendar.setTime(date);
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        return dayOfWeek < 1 || dayOfWeek > 5;
    }

    /**
     * 是否为工作日(包含调整工作日)
     *
     * @param yyyyMMdd 日期
     * @return boolean
     */
    public static boolean isWork(String yyyyMMdd) {
        if (!isWeekend(yyyyMMdd) && !isAdjust(yyyyMMdd)) {
            // 不为周六日,同时没有做过调整则为正常工作日
            return true;
        }
        // 为周六日,但做了调整变成了工作日
        return isWeekend(yyyyMMdd) && isAdjust(yyyyMMdd);
    }

}
